#pragma once

#include "iconfiguration_validator.h"
#include <QString>
#include <QHash>
#include <QVector>
#include <QRegularExpression>
#include <functional>

namespace infrastructure {

/**
 * @brief 验证规则类型
 */
enum class ValidationRuleType {
    Required,       // 必需的键
    TypeCheck,      // 类型检查
    Range,          // 数值范围
    Length,         // 字符串长度
    Pattern,        // 正则表达式模式
    Custom          // 自定义验证函数
};

/**
 * @brief 验证规则结构
 */
struct ValidationRule {
    QString key;                    // 配置键
    ValidationRuleType type;        // 验证类型
    QVariant expectedValue;         // 期望值（用于类型检查、范围等）
    QVariant additionalValue;       // 附加值（用于范围的最大值等）
    QString pattern;                // 正则表达式模式
    QString message;                // 错误消息
    QString severity;               // 严重级别
    std::function<bool(const QVariant&)> customValidator;  // 自定义验证函数
    
    ValidationRule() : type(ValidationRuleType::Required), severity("error") {}
};

/**
 * @class BasicConfigurationValidator
 * @brief 基本配置验证器，提供常见的验证规则
 */
class BasicConfigurationValidator : public IConfigurationValidator {
public:
    BasicConfigurationValidator();
    virtual ~BasicConfigurationValidator() = default;

    // IConfigurationValidator interface
    ValidationResult validate(const QHash<QString, QVariant>& configData) override;
    QString getName() const override;
    QString getDescription() const override;

    // 添加验证规则的便捷方法
    void addRequiredKey(const QString& key, const QString& message = "", const QString& severity = "error");
    void addTypeCheck(const QString& key, QVariant::Type expectedType, const QString& message = "", const QString& severity = "error");
    void addRangeCheck(const QString& key, const QVariant& min, const QVariant& max, const QString& message = "", const QString& severity = "error");
    void addLengthCheck(const QString& key, int minLength, int maxLength, const QString& message = "", const QString& severity = "error");
    void addPatternCheck(const QString& key, const QString& pattern, const QString& message = "", const QString& severity = "error");
    void addCustomCheck(const QString& key, std::function<bool(const QVariant&)> validator, const QString& message = "", const QString& severity = "error");
    
    // 管理验证规则
    void addRule(const ValidationRule& rule);
    void removeRule(const QString& key, ValidationRuleType type);
    void clearRules();
    QVector<ValidationRule> getRules() const;

private:
    QVector<ValidationRule> m_rules;
    
    bool validateRequired(const QString& key, const QHash<QString, QVariant>& configData);
    bool validateType(const ValidationRule& rule, const QVariant& value);
    bool validateRange(const ValidationRule& rule, const QVariant& value);
    bool validateLength(const ValidationRule& rule, const QVariant& value);
    bool validatePattern(const ValidationRule& rule, const QVariant& value);
    bool validateCustom(const ValidationRule& rule, const QVariant& value);
    
    QString generateDefaultMessage(const ValidationRule& rule) const;
};

} // namespace infrastructure 